/*
 * Parque.cpp
 *
 *  Created on: 05/07/2014
 *      Author: migue
 */

#include "Parque.h"
#include "../ipc/MemoriaCompartida.h"
#include <stddef.h>
#include <syslog.h>

Parque::Parque(bool crear) {
	if (crear)
		_mcParque = new MemoriaCompartida(RUTA, ID_SHM_PARQUE, sizeof(PARQUE));
	else
		_mcParque = NULL;
}

Parque::~Parque() {
	if (_mcParque != NULL)
		delete _mcParque;
}

void Parque::inicializar() {
	PARQUE parque;
	parque.cantPersonas = 0;
	parque.ultimoTicket = 0;
	parque.busesDeRepuestos = CANT_BUSES_REPUESTO;

	parque.parqueAbierto = false;

	_mcParque->escribir(0, (void*) &parque, sizeof(parque));
}

void Parque::destruir() {
	if (_mcParque != NULL) {
		_mcParque->destruir();
		delete _mcParque;
		_mcParque = NULL;
	}
}

bool Parque::hayEspacio() {
	PARQUE parque;

	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	return (parque.cantPersonas < CANT_MAX_PARQUE);
}

int Parque::registrarIngreso() {
	PARQUE parque;

	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	parque.cantPersonas++;

	int ticket = ++parque.ultimoTicket;

	_mcParque->escribir(0, (void*) &parque, sizeof(parque));

	return ticket;
}

void Parque::registrarSalida(int idPersona) {
	PARQUE parque;

	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	parque.cantPersonas--;

	_mcParque->escribir(0, (void*) &parque, sizeof(parque));
}

bool Parque::parqueAbierto() {
	PARQUE parque;

	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	return parque.parqueAbierto;
}

bool Parque::hayPersonasDentro() {
	PARQUE parque;

	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	return (parque.cantPersonas > 0);
}

void Parque::abrirParque() {
	cambiarParque(true);
}

void Parque::cerrarParque() {
	cambiarParque(false);
}

void Parque::cambiarParque(bool abierto) {
	PARQUE parque;
	_mcParque->leer(0, (void*) &parque, sizeof(parque));
	parque.parqueAbierto = abierto;
	_mcParque->escribir(0, (void*) &parque, sizeof(parque));
}

int Parque::personasDentro() {
	PARQUE parque;
	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	return parque.cantPersonas;
}

int Parque::busesDeRepuesto() {
	PARQUE parque;
	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	return parque.busesDeRepuestos;
}

void Parque::repuestoDeBUSUsado() {
	PARQUE parque;
	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	syslog(LOG_INFO, "Descontando cantidad de BUSES de repuesto del Parque");

	if (parque.busesDeRepuestos > 0) {
		parque.busesDeRepuestos--;
		_mcParque->escribir(0, (void*) &parque, sizeof(parque));
	}
}

void Parque::agregarBusesDeRepuesto(int cantidad) {
	PARQUE parque;
	_mcParque->leer(0, (void*) &parque, sizeof(parque));

	if (cantidad > 0) {
		parque.busesDeRepuestos += cantidad;
		_mcParque->escribir(0, (void*) &parque, sizeof(parque));
		syslog(LOG_INFO, "Agregados %i BUSES mas de repuesto", cantidad);
	}
}
